home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 January / PCWorld_2007-01_cd.bin / v cisle / autoit / autoit-v3.2.0.1-setup.exe / Include / File.au3 < prev    next >
Text File  |  2006-07-22  |  27KB  |  694 lines

  1. ; Include Version:1.66 (17 July 2006)
  2. #include-once
  3.  
  4. ; ------------------------------------------------------------------------------
  5. ;
  6. ; AutoIt Version: 3.0
  7. ; Language:       English
  8. ; Description:    Functions that assist with files and directories.
  9. ;
  10. ; ------------------------------------------------------------------------------
  11.  
  12.  
  13. ;===============================================================================
  14. ;
  15. ; Description:      Returns the number of lines in the specified file.
  16. ; Syntax:           _FileCountLines( $sFilePath )
  17. ; Parameter(s):     $sFilePath - Path and filename of the file to be read
  18. ; Requirement(s):   None
  19. ; Return Value(s):  On Success - Returns number of lines in the file
  20. ;                   On Failure - Returns 0 and sets @error = 1
  21. ; Author(s):        Tylo <tylo at start dot no>
  22. ; Note(s):          It does not count a final @LF as a line.
  23. ;
  24. ;===============================================================================
  25. Func _FileCountLines($sFilePath)
  26.     Local $N = FileGetSize($sFilePath) - 1
  27.     If @error Or $N = -1 Then Return 0
  28.     Return StringLen(StringAddCR(FileRead($sFilePath, $N))) - $N + 1
  29. EndFunc   ;==>_FileCountLines
  30.  
  31.  
  32. ;===============================================================================
  33. ;
  34. ; Description:      Creates or zero's out the length of the file specified.
  35. ; Syntax:           _FileCreate( $sFilePath )
  36. ; Parameter(s):     $sFilePath - Path and filename of the file to be created
  37. ; Requirement(s):   None
  38. ; Return Value(s):  On Success - Returns 1
  39. ;                   On Failure - Returns 0 and sets:
  40. ;                                @error = 1: Error opening specified file
  41. ;                                @error = 2: File could not be written to
  42. ; Author(s):        Brian Keene <brian_keene at yahoo dot com>
  43. ; Note(s):          None
  44. ;
  45. ;===============================================================================
  46. Func _FileCreate($sFilePath)
  47.     ;==============================================
  48.     ; Local Constant/Variable Declaration Section
  49.     ;==============================================
  50.     Local $hOpenFile
  51.     Local $hWriteFile
  52.     
  53.     $hOpenFile = FileOpen($sFilePath, 2)
  54.     
  55.     If $hOpenFile = -1 Then
  56.         SetError(1)
  57.         Return 0
  58.     EndIf
  59.     
  60.     $hWriteFile = FileWrite($hOpenFile, "")
  61.     
  62.     If $hWriteFile = -1 Then
  63.         SetError(2)
  64.         Return 0
  65.     EndIf
  66.     
  67.     FileClose($hOpenFile)
  68.     Return 1
  69. EndFunc   ;==>_FileCreate
  70.  
  71. ;===============================================================================
  72. ;
  73. ; Description:      lists all files and folders in a specified path (Similar to using Dir with the /B Switch)
  74. ; Syntax:           _FileListToArray($sPath, $sFilter = "*", $iFlag = 0)
  75. ; Parameter(s):        $sPath = Path to generate filelist for
  76. ;                   $iFlag = determines weather to return file or folders or both
  77. ;                    $sFilter = The filter to use. Search the Autoit3 manual for the word "WildCards" For details
  78. ;                        $iFlag=0(Default) Return both files and folders
  79. ;                       $iFlag=1 Return files Only
  80. ;                        $iFlag=2 Return Folders Only
  81. ;
  82. ; Requirement(s):   None
  83. ; Return Value(s):  On Success - Returns an array containing the list of files and folders in the specified path
  84. ;                        On Failure - Returns the an empty string "" if no files are found and sets @Error on errors
  85. ;                        @Error=1 Path not found or invalid
  86. ;                        @Error=2 Invalid $sFilter
  87. ;                       @Error=3 Invalid $iFlag
  88. ;                 @Error=4 No File(s) Found
  89. ;
  90. ; Author(s):        SolidSnake <MetalGearX91 at Hotmail dot com>
  91. ; Note(s):            The array returned is one-dimensional and is made up as follows:
  92. ;                    $array[0] = Number of Files\Folders returned
  93. ;                    $array[1] = 1st File\Folder
  94. ;                    $array[2] = 2nd File\Folder
  95. ;                    $array[3] = 3rd File\Folder
  96. ;                    $array[n] = nth File\Folder
  97. ;
  98. ;                    Special Thanks to Helge and Layer for help with the $iFlag update
  99. ;===============================================================================
  100. Func _FileListToArray($sPath, $sFilter = "*", $iFlag = 0)
  101.     Local $hSearch, $sFile, $asFileList[1]
  102.     If Not FileExists($sPath) Then Return SetError(1,1,"")
  103.     If (StringInStr($sFilter, "\")) or (StringInStr($sFilter, "/")) or (StringInStr($sFilter, ":")) or (StringInStr($sFilter, ">")) or (StringInStr($sFilter, "<")) or (StringInStr($sFilter, "|")) or (StringStripWS($sFilter, 8) = "") Then Return SetError(2,2,"")
  104.     If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3,3,"")
  105.     $hSearch = FileFindFirstFile($sPath & "\" & $sFilter)
  106.     If $hSearch = -1 Then Return SetError(4,4,"")
  107.     While 1
  108.         $sFile = FileFindNextFile($hSearch)
  109.         If @error Then 
  110.             SetError(0)
  111.             ExitLoop
  112.         EndIf
  113.         If $iFlag = 1 And StringInStr(FileGetAttrib($sPath & "\" & $sFile), "D") <> 0 Then ContinueLoop
  114.         If $iFlag = 2 And StringInStr(FileGetAttrib($sPath & "\" & $sFile), "D") = 0 Then ContinueLoop
  115.         ReDim $asFileList[UBound($asFileList) + 1]
  116.         $asFileList[0] = $asFileList[0] + 1
  117.         $asFileList[UBound($asFileList) - 1] = $sFile
  118.     WEnd
  119.     FileClose($hSearch)
  120.     Return $asFileList
  121. EndFunc   ;==>_FileListToArray
  122.  
  123. ;===============================================================================
  124. ; Function Name:   _FilePrint()
  125. ; Description:     Prints a plain text file.
  126. ; Syntax:          _FilePrint ( $s_File [, $i_Show] )
  127. ;
  128. ; Parameter(s):    $s_File     = The file to print.
  129. ;                  $i_Show     = The state of the window. (default = @SW_HIDE)
  130. ;
  131. ; Requirement(s):  External:   = shell32.dll (it's already in system32).
  132. ;                  Internal:   = None.
  133. ;
  134. ; Return Value(s): On Success: = Returns 1.
  135. ;                  On Failure: = Returns 0 and sets @error according to the global constants list.
  136. ;
  137. ; Author(s):       erifash <erifash [at] gmail [dot] com>
  138. ;
  139. ; Note(s):         Uses the ShellExecute function of shell32.dll.
  140. ;
  141. ; Example(s):
  142. ;   _FilePrint("C:\file.txt")
  143. ;===============================================================================
  144. Func _FilePrint($s_File, $i_Show = @SW_HIDE)
  145.     Local $a_Ret = DllCall("shell32.dll", "long", "ShellExecute", _
  146.             "hwnd", 0, _
  147.             "string", "print", _
  148.             "string", $s_File, _
  149.             "string", "", _
  150.             "string", "", _
  151.             "int", $i_Show)
  152.     If $a_Ret[0] > 32 And Not @error Then
  153.         Return 1
  154.     Else
  155.         SetError($a_Ret[0])
  156.         Return 0
  157.     EndIf
  158. EndFunc   ;==>_FilePrint
  159.  
  160. ;===============================================================================
  161. ;
  162. ; Description:      Reads the specified file into an array.
  163. ; Syntax:           _FileReadToArray( $sFilePath, $aArray )
  164. ; Parameter(s):     $sFilePath - Path and filename of the file to be read
  165. ;                   $aArray    - The array to store the contents of the file
  166. ; Requirement(s):   None
  167. ; Return Value(s):  On Success - Returns 1
  168. ;                   On Failure - Returns 0 and sets @error = 1
  169. ; Author(s):        Jonathan Bennett <jon at hiddensoft dot com>
  170. ; Note(s):          None
  171. ;
  172. ;===============================================================================
  173. Func _FileReadToArray($sFilePath, ByRef $aArray)
  174.     ;==============================================
  175.     ; Local Constant/Variable Declaration Section
  176.     ;==============================================
  177.     Local $hFile
  178.     
  179.     $hFile = FileOpen($sFilePath, 0)
  180.     
  181.     If $hFile = -1 Then
  182.         SetError(1)
  183.         Return 0
  184.     EndIf
  185.     
  186.     $aArray = StringSplit( StringStripCR( FileRead($hFile, FileGetSize($sFilePath))), @LF)
  187.     
  188.     FileClose($hFile)
  189.     Return 1
  190. EndFunc   ;==>_FileReadToArray
  191.  
  192. ;===============================================================================
  193. ;
  194. ; Description:      Write array to File.
  195. ; Syntax:           _FileWriteFromArray( $sFilePath, $aArray )
  196. ; Parameter(s):     $sFilePath - Path and filename of the file to be written
  197. ;                   $a_Array   - The array to retrieve the contents
  198. ;                   $i_Base    - Start reading at this Array entry.
  199. ;                   $I_Ubound  - End reading at this Array entry.
  200. ;                                Default UBound($a_Array) - 1
  201. ; Requirement(s):   None
  202. ; Return Value(s):  On Success - Returns 1
  203. ;                   On Failure - Returns 0 and sets @error = 1
  204. ; Author(s):        Jos van der Zande <jdeb at autoitscript dot com>
  205. ; Note(s):          None
  206. ;
  207. ;===============================================================================
  208. Func _FileWriteFromArray($sFilePath, $a_Array, $i_Base = 0, $i_UBound = 0)
  209.     ;==============================================
  210.     ; Local Constant/Variable Declaration Section
  211.     ;==============================================
  212.     Local $hFile
  213.     ; Check if we have a valid array as input
  214.     If Not IsArray($a_Array) Then
  215.         SetError(2)
  216.         Return 0
  217.     EndIf
  218.     ; determine last entry
  219.     Local $last = UBound($a_Array) - 1
  220.     If $i_UBound < 1 Or $i_UBound > $last Then $i_UBound = $last
  221.     If $i_Base < 0 Or $i_Base > $last Then $i_Base = 0
  222.     ; Open output file
  223.     $hFile = FileOpen($sFilePath, 2)
  224.     
  225.     If $hFile = -1 Then
  226.         SetError(1)
  227.         Return 0
  228.     EndIf
  229.     ;
  230.     FileWrite($hFile, $a_Array[$i_Base])
  231.     For $x = $i_Base + 1 To $i_UBound
  232.         FileWrite($hFile, @CRLF & $a_Array[$x])
  233.     Next
  234.     
  235.     FileClose($hFile)
  236.     Return 1
  237. EndFunc   ;==>_FileWriteFromArray
  238.  
  239. ;===============================================================================
  240. ;
  241. ; Description:      Writes the specified text to a log file.
  242. ; Syntax:           _FileWriteLog( $sLogPath, $sLogMsg )
  243. ; Parameter(s):     $sLogPath - Path and filename to the log file
  244. ;                   $sLogMsg  - Message to be written to the log file
  245. ; Requirement(s):   None
  246. ; Return Value(s):  On Success - Returns 1
  247. ;                   On Failure - Returns 0 and sets:
  248. ;                                @error = 1: Error opening specified file
  249. ;                                @error = 2: File could not be written to
  250. ; Author(s):        Jeremy Landes <jlandes at landeserve dot com>
  251. ; Note(s):          If the text to be appended does NOT end in @CR or @LF then
  252. ;                   a DOS linefeed (@CRLF) will be automatically added.
  253. ;
  254. ;===============================================================================
  255. Func _FileWriteLog($sLogPath, $sLogMsg)
  256.     ;==============================================
  257.     ; Local Constant/Variable Declaration Section
  258.     ;==============================================
  259.     Local $sDateNow
  260.     Local $sTimeNow
  261.     Local $sMsg
  262.     Local $hOpenFile
  263.     Local $hWriteFile
  264.     
  265.     $sDateNow = @YEAR & "-" & @MON & "-" & @MDAY
  266.     $sTimeNow = @HOUR & ":" & @MIN & ":" & @SEC
  267.     $sMsg = $sDateNow & " " & $sTimeNow & " : " & $sLogMsg
  268.     
  269.     $hOpenFile = FileOpen($sLogPath, 1)
  270.     
  271.     If $hOpenFile = -1 Then
  272.         SetError(1)
  273.         Return 0
  274.     EndIf
  275.     
  276.     $hWriteFile = FileWriteLine($hOpenFile, $sMsg)
  277.     
  278.     If $hWriteFile = -1 Then
  279.         SetError(2)
  280.         Return 0
  281.     EndIf
  282.     
  283.     FileClose($hOpenFile)
  284.     Return 1
  285. EndFunc   ;==>_FileWriteLog
  286.  
  287. ;========================================
  288. ;Function name:       _FileWriteToLine
  289. ;Description:         Write text to specified line in a file
  290. ;Parameters:
  291. ;                     $sFile - The file to write to
  292. ;                     $iLine - The line number to write to
  293. ;                     $sText - The text to write
  294. ;                     $fOverWrite - if set to 1 will overwrite the old line
  295. ;                     if set to 0 will not overwrite
  296. ;Requirement(s):      None
  297. ;Return Value(s):     On success - 1
  298. ;                      On Failure - 0 And sets @ERROR
  299. ;                                @ERROR = 1 - File has less lines than $iLine
  300. ;                                @ERROR = 2 - File does not exist
  301. ;                                @ERROR = 3 - Error opening file
  302. ;                                @ERROR = 4 - $iLine is invalid
  303. ;                                @ERROR = 5 - $fOverWrite is invalid
  304. ;                                @ERROR = 6 - $sText is invalid
  305. ;Author(s):           cdkid
  306. ;Note(s):
  307. ;=========================================
  308. Func _FileWriteToLine($sFile, $iLine, $sText, $fOverWrite = 0)
  309.     If $iLine <= 0 Then
  310.         SetError(4)
  311.         Return 0
  312.     EndIf
  313.     If Not IsString($sText) Then
  314.         SetError(6)
  315.         Return 0
  316.     EndIf
  317.     If $fOverWrite <> 0 And $fOverWrite <> 1 Then
  318.         SetError(5)
  319.         Return 0
  320.     EndIf
  321.     If Not FileExists($sFile) Then
  322.         SetError(2)
  323.         Return 0
  324.     EndIf
  325.     Local $filtxt = FileRead($sFile, FileGetSize($sFile))
  326.     $filtxt = StringSplit($filtxt, @CRLF, 1)
  327.     If UBound($filtxt, 1) < $iLine Then
  328.         SetError(1)
  329.         Return 0
  330.     EndIf
  331.     Local $fil = FileOpen($sFile, 2)
  332.     If $fil = -1 Then
  333.         SetError(3)
  334.         Return 0
  335.     EndIf
  336.     For $i = 1 To UBound($filtxt) - 1
  337.         If $i = $iLine Then
  338.             If $fOverWrite = 1 Then
  339.                 If $sText <> '' Then
  340.                     FileWrite($fil, $sText & @CRLF)
  341.                 Else
  342.                     FileWrite($fil, $sText)
  343.                 EndIf
  344.             EndIf
  345.             If $fOverWrite = 0 Then
  346.                 FileWrite($fil, $sText & @CRLF)
  347.                 FileWrite($fil, $filtxt[$i] & @CRLF)
  348.             EndIf
  349.         ElseIf $i < UBound($filtxt, 1) - 1 Then
  350.             FileWrite($fil, $filtxt[$i] & @CRLF)
  351.         ElseIf $i = UBound($filtxt, 1) - 1 Then
  352.             FileWrite($fil, $filtxt[$i])
  353.         EndIf
  354.     Next
  355.     FileClose($fil)
  356.     Return 1
  357. EndFunc   ;==>_FileWriteToLine
  358.  
  359. ; ===================================================================
  360. ; Author: Valik
  361.     ;        updated 2006/01/07
  362.     ;
  363.     ; _PathFull($szRelPath)
  364.     ;
  365.     ; Creates a path based on the relative path you provide.  For example, if you specify:
  366.     ;    "C:\test\folder\..\file.txt", the output would be "C:\test\file.txt" because of the ..\.
  367.     ;    If no relative path is specified, the current working directory is returned.  If no drive is specified,
  368.     ;    the new path is relative to the current working directory.  Passing only a drive will return the
  369.     ;    current working directory for that drive.  This function depends on _PathSplit and _PathMake.
  370.     ; Parameters:
  371.     ;     $szRelPath - IN - The relative path
  372.     ; Returns:
  373.     ;    The newly created absolute path is returned (Same as $szABSPath)
  374.     ; ===================================================================
  375. Func _PathFull($szRelPath)
  376.     Local $drive, $dir, $file, $ext, $wDrive, $NULL
  377.     Local $i, $nPos; For Opt("MustDeclareVars", 1)
  378.     ; Let's use _PathSplit to make this a hell of a lot easier to work with
  379.     _PathSplit($szRelPath, $drive, $dir, $file, $ext)
  380.     _PathSplit(@WorkingDir, $wDrive, $NULL, $NULL, $NULL)
  381.     
  382.     ; If no drive specified, then we use the working directory to set our path relative to
  383.     If Not StringLen($drive) Then
  384.         $drive = $wDrive
  385.         If StringLen(@WorkingDir) = StringLen($drive) + 1 Then
  386.             $dir = StringTrimLeft(@WorkingDir, StringLen($drive)) & $dir
  387.         Else
  388.             $dir = StringTrimLeft(@WorkingDir, StringLen($drive)) & "\" & $dir
  389.         EndIf
  390.     EndIf
  391.     
  392.     ; If the only thing specified was the drive, then return the working directory for that drive
  393.     If Not StringLen($dir) And Not StringLen($file) And Not StringLen($ext) Then
  394.         If $drive = $wDrive Then Return @WorkingDir
  395.         Return _PathMake($drive, "\", "", "")
  396.     EndIf
  397.     
  398.     ; Look for any .\ and ..\
  399.     While StringInStr($dir, ".\") Or StringInStr($dir, "./")
  400.         $nPos = StringInStr($dir, ".\")
  401.         If $nPos = 0 Then $nPos = StringInStr($dir, "./")
  402.         If $nPos = 0 Then ExitLoop
  403.         If StringMid($dir, $nPos - 1, 1) = "." Then; It's ..\
  404.             For $i = ($nPos - 3) To 0 Step - 1
  405.                 If StringMid($dir, $i, 1) = "\" Or StringMid($dir, $i, 1) = "/" Then ExitLoop
  406.             Next
  407.             If $i > 0 Then
  408.                 $dir = StringLeft($dir, $i) & StringRight($dir, StringLen($dir) - ($nPos + 1))
  409.             Else
  410.                 $dir = StringRight($dir, StringLen($dir) - ($nPos + 1))
  411.             EndIf
  412.         Else; It's .\
  413.             $dir = StringLeft($dir, $nPos - 1) & StringRight($dir, StringLen($dir) - $nPos - 1)
  414.         EndIf
  415.         If Not StringLen($dir) Then $dir = "\"
  416.     WEnd
  417.     Return _PathMake($drive, $dir, $file, $ext)
  418. EndFunc   ;==>_PathFull
  419.  
  420. ; ===================================================================
  421. ; Author: Valik
  422. ;
  423. ; _PathMake($szDrive, $szDir, $szFName, $szExt)
  424. ;
  425. ; Creates a string containing the path from drive, directory, file name and file extension parts.  Not all parts must be
  426. ;    passed. The path will still be built with what is passed.  This doesn't check the validity of the path
  427. ;    created, it could contain characters which are invalid on your filesystem.
  428. ; Parameters:
  429. ;     $szDrive - IN - Drive (Can be UNC).  If it's a drive letter, a : is automatically appended
  430. ;     $szDir - IN - Directory.  A trailing slash is added if not found (No preceeding slash is added)
  431. ;     $szFName - IN - The name of the file
  432. ;     $szExt - IN - The file extension.  A period is supplied if not found in the extension
  433. ; Returns:
  434. ;    The string for the newly created path
  435. ; ===================================================================
  436. Func _PathMake($szDrive, $szDir, $szFName, $szExt)
  437.     ; Format $szDrive, if it's not a UNC server name, then just get the drive letter and add a colon
  438.     Local $szFullPath
  439.     ;
  440.     If StringLen($szDrive) Then
  441.         If Not (StringLeft($szDrive, 2) = "\\") Then    $szDrive = StringLeft($szDrive, 1) & ":"
  442.     EndIf
  443.     
  444.     ; Format the directory by adding any necessary slashes
  445.     If StringLen($szDir) Then
  446.         If Not (StringRight($szDir, 1) = "\") And Not (StringRight($szDir, 1) = "/") Then $szDir = $szDir & "\"
  447.     EndIf
  448.     
  449.     ; Nothing to be done for the filename
  450.     
  451.     ; Add the period to the extension if necessary
  452.     If StringLen($szExt) Then
  453.         If Not (StringLeft($szExt, 1) = ".") Then $szExt = "." & $szExt
  454.     EndIf
  455.     
  456.     $szFullPath = $szDrive & $szDir & $szFName & $szExt
  457.     Return $szFullPath
  458. EndFunc   ;==>_PathMake
  459.  
  460. ; ===================================================================
  461. ; Author: Valik
  462. ;
  463. ; _PathSplit($szPath, ByRef $szDrive, ByRef $szDir, ByRef $szFName, ByRef $szExt)
  464. ;
  465. ; Splits a path into the drive, directory, file name and file extension parts.  An empty string is set if a
  466. ;    part is missing.
  467. ; Parameters:
  468. ;    $szPath - IN - The path to be split (Can contain a UNC server or drive letter)
  469. ;    $szDrive - OUT - String to hold the drive
  470. ;     $szDir - OUT - String to hold the directory
  471. ;     $szFName - OUT - String to hold the file name
  472. ;     $szExt - OUT - String to hold the file extension
  473. ; Returns:
  474. ;    Array with 5 elements where 0 = original path, 1 = drive, 2 = directory, 3 = filename, 4 = extension
  475. ; ===================================================================
  476. Func _PathSplit($szPath, ByRef $szDrive, ByRef $szDir, ByRef $szFName, ByRef $szExt)
  477.     ; Set local strings to null (We use local strings in case one of the arguments is the same variable)
  478.     Local $drive = ""
  479.     Local $dir = ""
  480.     Local $fname = ""
  481.     Local $ext = ""
  482.     Local $i, $pos; For Opt("MustDeclareVars", 1)
  483.     
  484.     ; Create an array which will be filled and returned later
  485.     Local $array[5]
  486.     $array[0] = $szPath; $szPath can get destroyed, so it needs set now
  487.     
  488.     ; Get drive letter if present (Can be a UNC server)
  489.     If StringMid($szPath, 2, 1) = ":" Then
  490.         $drive = StringLeft($szPath, 2)
  491.         $szPath = StringTrimLeft($szPath, 2)
  492.     ElseIf StringLeft($szPath, 2) = "\\" Then
  493.         $szPath = StringTrimLeft($szPath, 2) ; Trim the \\
  494.         $pos = StringInStr($szPath, "\")
  495.         If $pos = 0 Then $pos = StringInStr($szPath, "/")
  496.         If $pos = 0 Then
  497.             $drive = "\\" & $szPath; Prepend the \\ we stripped earlier
  498.             $szPath = ""; Set to null because the whole path was just the UNC server name
  499.         Else
  500.             $drive = "\\" & StringLeft($szPath, $pos - 1) ; Prepend the \\ we stripped earlier
  501.             $szPath = StringTrimLeft($szPath, $pos - 1)
  502.         EndIf
  503.     EndIf
  504.     
  505.     ; Set the directory and file name if present
  506.     For $i = StringLen($szPath) To 0 Step - 1
  507.         If StringMid($szPath, $i, 1) = "\" Or StringMid($szPath, $i, 1) = "/" Then
  508.             $dir = StringLeft($szPath, $i)
  509.             $fname = StringRight($szPath, StringLen($szPath) - $i)
  510.             ExitLoop
  511.         EndIf
  512.     Next
  513.     
  514.     ; If $szDir wasn't set, then the whole path must just be a file, so set the filename
  515.     If StringLen($dir) = 0 Then $fname = $szPath
  516.     
  517.     ; Check the filename for an extension and set it
  518.     For $i = StringLen($fname) To 0 Step - 1
  519.         If StringMid($fname, $i, 1) = "." Then
  520.             $ext = StringRight($fname, StringLen($fname) - ($i - 1))
  521.             $fname = StringLeft($fname, $i - 1)
  522.             ExitLoop
  523.         EndIf
  524.     Next
  525.     
  526.     ; Set the strings and array to what we found
  527.     $szDrive = $drive
  528.     $szDir = $dir
  529.     $szFName = $fname
  530.     $szExt = $ext
  531.     $array[1] = $drive
  532.     $array[2] = $dir
  533.     $array[3] = $fname
  534.     $array[4] = $ext
  535.     Return $array
  536. EndFunc   ;==>_PathSplit
  537.  
  538. ; ===================================================================
  539. ; Author: Kurt (aka /dev/null) and JdeB
  540. ;
  541. ; _ReplaceStringInFile($szFileName, $szSearchString, $szReplaceString,$bCaseness = 0, $bOccurance = 0)
  542. ;
  543. ; Replaces a string ($szSearchString) with another string ($szReplaceString) the given TEXT file
  544. ; (via filename)
  545. ;
  546. ; Operation:
  547. ; The funnction opens the original file for reading and a temp file for writing. Then
  548. ; it reads in all lines and searches for the string. If it was found, the original line will be
  549. ; modified and written to the temp file. If the string was not found, the original line will be
  550. ; written to the temp file. At the end the original file will be deleted and the temp file will
  551. ; be renamed.
  552. ;
  553. ; Parameters:
  554. ;     $szFileName         name of the file to open.
  555. ;                ATTENTION !! Needs the FULL path, not just the name returned by eg. FileFindNextFile
  556. ;     $szSearchString        The string we want to replace in the file
  557. ;     $szReplaceString    The string we want as a replacement for $szSearchString
  558. ;     $fCaseness        shall case matter?
  559. ;                0 = NO, case doe not matter (default), 1 = YES, case does matter
  560. ;    $fOccurance        shall we replace the string in every line or just the first occurance
  561. ;                0 = first only, 1 = ALL strings (default)
  562. ;
  563. ; Return Value(s):
  564. ;    On Success         Returns the number of occurences of $szSearchString we found
  565. ;
  566. ;    On Failure         Returns -1 sets @error
  567. ;                    @error=1    Cannot open file
  568. ;                    @error=2    Cannot open temp file
  569. ;                    @error=3    Cannot write to temp file
  570. ;                    @error=4    Cannot delete original file
  571. ;                    @error=5    Cannot rename/move temp file
  572. ;
  573. ; ===================================================================
  574. Func _ReplaceStringInFile($szFileName, $szSearchString, $szReplaceString, $fCaseness = 0, $fOccurance = 1)
  575.     
  576.     Local $iRetVal = 0
  577.     Local $szTempFile, $hWriteHandle, $aFileLines, $nCount, $sEndsWith, $hFile
  578.     ;===============================================================================
  579.     ;== Read the file into an array
  580.     ;===============================================================================
  581.     $hFile = FileOpen($szFileName, 0)
  582.     If $hFile = -1 Then
  583.         SetError(1)
  584.         Return -1
  585.     EndIf
  586.     Local $s_TotFile = FileRead($hFile, FileGetSize($szFileName))
  587.     If StringRight($s_TotFile, 2) = @CRLF Then
  588.         $sEndsWith = @CRLF
  589.     ElseIf StringRight($s_TotFile, 1) = @CR Then
  590.         $sEndsWith = @CR
  591.     ElseIf StringRight($s_TotFile, 1) = @LF Then
  592.         $sEndsWith = @LF
  593.     Else
  594.         $sEndsWith = ""
  595.     EndIf
  596.     $aFileLines = StringSplit(StringStripCR($s_TotFile), @LF)
  597.     FileClose($hFile)
  598.     ;===============================================================================
  599.     ;== Open the temporary file in write mode
  600.     ;===============================================================================
  601.     $szTempFile = _TempFile()
  602.     
  603.     $hWriteHandle = FileOpen($szTempFile, 2)
  604.     If $hWriteHandle = -1 Then
  605.         SetError(2)
  606.         Return -1
  607.     EndIf
  608.     ;===============================================================================
  609.     ;== Loop through the array and search for $szSearchString
  610.     ;===============================================================================
  611.     For $nCount = 1 To $aFileLines[0]
  612.         If StringInStr($aFileLines[$nCount], $szSearchString, $fCaseness) Then
  613.             $aFileLines[$nCount] = StringReplace($aFileLines[$nCount], $szSearchString, $szReplaceString, 1 - $fOccurance, $fCaseness)
  614.             $iRetVal = $iRetVal + 1
  615.             
  616.             ;======================================================================
  617.             ;== If we want just the first string replaced, copy the rest of the lines
  618.             ;== and stop
  619.             ;======================================================================
  620.             If $fOccurance = 0 Then
  621.                 $iRetVal = 1
  622.                 ExitLoop
  623.             EndIf
  624.         EndIf
  625.     Next
  626.     ;===============================================================================
  627.     ;== Write the lines to a temp file.
  628.     ;===============================================================================
  629.     For $nCount = 1 To $aFileLines[0] - 1
  630.         If FileWriteLine($hWriteHandle, $aFileLines[$nCount]) = 0 Then
  631.             SetError(3)
  632.             FileClose($hWriteHandle)
  633.             Return -1
  634.         EndIf
  635.     Next
  636.     ; Write the last record and ensure it ends wit hthe same as the input file
  637.     If $aFileLines[$nCount] <> "" Then FileWrite($hWriteHandle, $aFileLines[$nCount] & $sEndsWith)
  638.     FileClose($hWriteHandle)
  639.     
  640.     ;======================================================================
  641.     ;== Delete the original file
  642.     ;======================================================================
  643.     If FileDelete($szFileName) = 0 Then
  644.         SetError(4)
  645.         Return -1
  646.     EndIf
  647.     
  648.     ;======================================================================
  649.     ;== Rename the temp file to the original file
  650.     ;======================================================================
  651.     If FileMove($szTempFile, $szFileName) = 0 Then
  652.         SetError(5)
  653.         Return -1
  654.     EndIf
  655.     
  656.     Return $iRetVal
  657. EndFunc   ;==>_ReplaceStringInFile
  658.  
  659. ;========================================================================================================
  660. ;
  661. ; Function Name:    _TempFile([s_DirectoryName],[s_FilePrefix], [s_FileExtension], [i_RandomLength)
  662. ; Description:      Generate a name for a temporary file. The file is guaranteed not to already exist.
  663. ; Parameter(s):
  664. ;     $s_DirectoryName    optional  Name of directory for filename, defaults to @TempDir
  665. ;     $s_FilePrefix       optional  File prefixname, defaults to "~"
  666. ;     $s_FileExtension    optional  File extenstion, defaults to ".tmp"
  667. ;     $i_RandomLength     optional  Number of characters to use to generate a unique name, defaults to 7
  668. ; Requirement(s):   None.
  669. ; Return Value(s):  Filename of a temporary file which does not exist.
  670. ; Author(s):        Dale (Klaatu) Thompson
  671. ;                   Hans Harder - Added Optional parameters
  672. ; Notes:            None.
  673. ;
  674. ;========================================================================================================
  675. Func _TempFile($s_DirectoryName = @TempDir, $s_FilePrefix = "~", $s_FileExtension = ".tmp", $i_RandomLength = 7)
  676.     Local $s_TempName
  677.     ; Check parameters
  678.     If Not FileExists($s_DirectoryName) Then $s_DirectoryName = @TempDir   ; First reset to default temp dir
  679.     If Not FileExists($s_DirectoryName) Then $s_DirectoryName = @ScriptDir ; Still wrong then set to Scriptdir
  680.     ; add trailing \ for directory name
  681.     If StringRight($s_DirectoryName, 1) <> "\" Then $s_DirectoryName = $s_DirectoryName & "\"
  682.     ;
  683.     Do
  684.         $s_TempName = ""
  685.         While StringLen($s_TempName) < $i_RandomLength
  686.             $s_TempName = $s_TempName & Chr(Random(97, 122, 1))
  687.         WEnd
  688.         $s_TempName = $s_DirectoryName & $s_FilePrefix & $s_TempName & $s_FileExtension
  689.     Until Not FileExists($s_TempName)
  690.     
  691.     Return ($s_TempName)
  692. EndFunc   ;==>_TempFile
  693.  
  694.